package cn.huiyunche.base.service.interfaces;

import cn.huiyunche.base.service.model.CTurnover;
import cn.huiyunche.base.service.vo.CTurnoverAdminVo;
import cn.huiyunche.base.service.vo.PageVo;
import cn.huiyunche.base.service.vo.Result;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 账户流水明细接口
 *
 * @author lm
 */
public interface CAccntTurnOverService {

    /**
     * 查询当前用户账户流水明细
     *
     * @param page
     * @return
     */
    Result<Map<String, Object>> getDetails(PageVo page);

    /**
     * 增加账户流水
     * 更新账户余额
     *
     * @param cTurnovers
     * @param quickcash  是否是快速提现 0:不是 1:是
     * @return
     */
    boolean addDetailsAndLedger(List<CTurnover> cTurnovers, Integer quickcash);

    /**
     * 生成账单 更新billID
     *
     * @param beginDate
     * @param endDate
     * @param userId
     * @param userType
     * @param payTypes
     * @param userIdSet
     * @param status
     * @return
     */
    int updateBnoByBillid(Date beginDate, Date endDate, Long userId, int userType, List<Integer> payTypes, Set<Long> userIdSet, int status);

    /**
     * 生成账单 更新billID
     *
     * @param beginDate
     * @param endDate
     * @param userId
     * @param userType
     * @param payTypes
     * @param userIdSet 物流企业 去除不是按照自然月结算的公司
     * @param status
     * @return
     */
    int updateBnoByBillidNoUser(Date beginDate, Date endDate, Long userId, int userType, List<Integer> payTypes, Set<Long> userIdSet, int status);

    /**
     * 订单完成－给司机账户加钱
     *
     * @param orderid
     * @return
     */
    boolean addOrderAmount(long orderid);

    /**
     * 查询订单已支付司机金额和未支付司机金额
     *
     * @param userId
     * @param orderId
     * @return
     */
    Map<String, BigDecimal> selectDriverOrderAmount(Long userId, Long orderId);

    /**
     * 查询账单明细
     *
     * @param page
     * @param cTurnover
     * @param amount
     * @param billStatus
     * @return
     */
    Map<String, Object> getDetails(PageVo page, CTurnover cTurnover, BigDecimal amount, BigDecimal usedAmount, int billStatus);

    /**
     * 判断提现每天每人不能超过3次
     *
     * @param userId
     * @param userType
     * @return
     */
    Result<Object> valWithdrawalLe3(BigDecimal amount, Long userId, Integer userType);

    /**
     * 企业月账单 更新明细
     *
     * @param beginDate
     * @param endDate
     * @param userId
     * @param userType
     * @param payTypes
     * @param status
     * @return
     */
    int updateBnoByCompanyBillid(Date beginDate, Date endDate, Long userId, int userType, List<Integer> payTypes,
                                 int status);

    /**
     * 查询账户流水 按照月份区分
     *
     * @param page
     * @return
     */
    Result<Map<String, Object>> getDetailsGroupMonth(PageVo page);

    /**
     * 人送车项目 司机增加流水和账户余额
     *
     * @param waybillId
     * @param confirmTotalCost
     * @param userId
     * @return
     */
    boolean addSendByDriverCost(Long waybillId, BigDecimal confirmTotalCost, Long userId);

    /**
     * 同城 账单明细
     *
     * @param page
     * @param billid
     * @return
     */
    Map<String, Object> selectVeneerDetails(PageVo page, Long billid);

    /**
     * 人送项目 账单流水
     *
     * @param page
     * @param cTurnover
     * @return
     */
    Map<String, Object> getsendByDriverDetails(PageVo page, CTurnoverAdminVo cTurnover);

    /**
     * 分供方 我的账单
     *
     * @param page
     * @return
     */
    Result<Map<String, Object>> getDriver3rdDetailsGroupMonth(PageVo page);

    /**
     * 商户账单明细
     *
     * @param page
     * @param billId
     * @return
     */
    Map<String, Object> getKyleBussDetails(PageVo page, List<Long> billIds);
}
